先介紹幾個關鍵字
Concurrency:併發
Parallelism:並行
不同的代碼塊會依照順序在process上執行,以一個cpu為基礎,使用multi-threading等方式提高cpu的使用率,
thread之間會互相切換,輪流被interpreter執行。
不同的代碼塊同時執行,以多核cpu為基礎,每個cpu獨立執行一個process,各個cpu之間的數據互相獨立。
main()其實就是一個goroutine,除了main(),只要在func外加入go關鍵字就可以建造新的goroutine執行Concurrency。
package main
import (
"fmt"
"time"
)
func loopTime() {
for i := 0; i < 5; i++ {
fmt.Println(time.Now())
time.Sleep(1 * time.Second)
}
}
func main() {
go loopTime()
for i := 0; i < 5; i++ {
fmt.Println("Hi")
time.Sleep(1 * time.Second)
}
}
程式先為main()創造一個goroutine,在loopTime()前面加上go,又會再創造一個新的goroutine。
也可以使用匿名方法(Anonymous function)來創造goroutine
匿名方法的簡單範例
// Go program to illustrate how
// to create an anonymous function
package main
import "fmt"
func main() {
// Anonymous function
func(){
fmt.Println("Welcome! to GeeksforGeeks")
}()
}
匿名方法創造goroutine,就是在匿名方法前加入go關鍵字
package main
import (
"fmt"
"time"
)
func loopTime() {
for i := 0; i < 5; i++ {
fmt.Println(time.Now())
time.Sleep(1 * time.Second)
}
}
func main() {
// Anonymous function
go func() {
loopTime()
}()
for i := 0; i < 5; i++ {
fmt.Println("Hi")
time.Sleep(1 * time.Second)
}
}
Go內建的sync.WaitGroup內部有一個計數器,最初從0開始,它有三個方法:Add(), Done(), Wait() 用來控制計數器的數量。Add(n) 把計數器設置為n ,Done() 每次把計數器-1 ,wait() 會阻塞代碼的運行,直到計數器地值減為0。
將code修改如下,會發現程式會因為wg.Wait()的關係處於等待狀態,等go func 結束,wg.Done()將計數器歸0後,才會繼續執行印出5次hi的動作。
package main
import (
"fmt"
"sync"
"time"
)
func loopTime() {
for i := 0; i < 5; i++ {
fmt.Println(time.Now())
time.Sleep(1 * time.Second)
}
}
func main() {
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
loopTime()
wg.Done()
}()
wg.Wait()
for i := 0; i < 5; i++ {
fmt.Println("Hi")
time.Sleep(1 * time.Second)
}
}